package leetCode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * 给定一个长度为4的整数数组cards。
 * 你有 4 张卡片，每张卡片上都包含一个范围在 [1,9] 的数字。
 * 您应该使用运算符['+', '-', '*', '/']和括号'('和')'
 * 将这些卡片上的数字排列成数学表达式，以获得值24。
 */
public class Q679_HJ67 {
    public boolean judgePoint24(int[] nums) {
        List<Double> list = new ArrayList<>(4);
        for (int num : nums) {
            list.add((double) num);
        }
        return solve(list);
    }
    boolean solve(List<Double> nums){
        if(nums.size() == 1){
            return Math.abs(nums.get(0) - 24) <= 0.00001;
        }
        for(int i = 0; i < nums.size(); i++){
            for(int j = i + 1; j < nums.size(); j++){
                // 枚举两数组合
                List<Double> copy = new ArrayList<>(nums);
                double b = copy.remove(j), a = copy.remove(i);
                boolean valid = false;

                copy.add(a + b);
                valid |= solve(copy);

                copy.set(copy.size() - 1, a - b);
                valid |= solve(copy);

                copy.set(copy.size() - 1, a * b);
                valid |= solve(copy);

                copy.set(copy.size() - 1, a / b);
                valid |= solve(copy);

                copy.set(copy.size() - 1, b - a);
                valid |= solve(copy);

                copy.set(copy.size() - 1, b / a);
                valid |= solve(copy);

                if(valid) return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        String[] sarr = in.nextLine().split(" ");
        int[] ints = Arrays
                .stream(sarr)
                .mapToInt(i -> Integer.parseInt(i))
                .toArray();

        System.out.println(new Q679_HJ67().judgePoint24(ints));
    }
}
